/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.cobranza.mbean;

import com.brain.cobranza.dto.CampoDto;
import com.brain.cobranza.dto.CampoEmpresaDto;
import com.brain.cobranza.dto.EmpresaCobranzaDto;
import com.brain.cobranza.manager.CampoEmpresaManager;
import com.brain.cobranza.manager.CampoManager;
import com.brain.cobranza.manager.EmpresaCobranzaManager;
import com.brain.cobranza.util.UtilCobranza;
import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.exception.DAOException;
import com.brain.core.view.mbean.*;
import com.brain.core.manager.BitacoraManager;
import com.brain.core.manager.RecursosManager;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 *
 * @author Indra
 */
@Controller("empresaCobranzaMBean")
@Scope("session")
public class EmpresaCobranzaMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(EmpresaCobranzaMBean.class);
    @Resource
    private EmpresaCobranzaManager manager;
    @Resource
    private CampoEmpresaManager detaManager;
    @Resource
    private BitacoraManager bitacoraManager;
    @Resource
    private CampoManager campoManager;
    @Resource
    private RecursosManager recursosManager;
    @Autowired
    private ApplicationMBean applicationMBean;
    @Autowired
    private SessionMBean sessionMBean;
    private List<EmpresaCobranzaDto> lista;
    private EmpresaCobranzaDto dto;
    private EmpresaCobranzaDto dtoFiltro;
    private CampoEmpresaDto detaDto;
    private String tituloDetalle;
    private String keyEntidad = "key.entidad.empresa";
    private String keyDetalle = "key.entidad.detalle";
    private SelectItem[] siTipoArchivo;
    private SelectItem[] siTiposDatos;
    private SelectItem[] siCampoDestino;
    private List<CampoEmpresaDto> listaCliente;
    private List<CampoEmpresaDto> listaPago;
    private List<CampoDto> listaCampo;

    public EmpresaCobranzaMBean() {
        this.dtoFiltro = new EmpresaCobranzaDto();
    }

    public String iniciar() {
        this.lista = null;
        this.dto = null;
        this.dtoFiltro = new EmpresaCobranzaDto();
        this.detaDto = new CampoEmpresaDto();
        this.detaDto = this.detaManager.inicializar();
        return manager.getUrlLista();
    }

    public String nuevo() {
        sessionMBean.setAccion(applicationMBean.getNuevo());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        this.dto = manager.inicializar();
        return manager.getUrl();
    }

    public void nuevoDetalle() {
        sessionMBean.setAccionDetalle(applicationMBean.getNuevo());
        this.tituloDetalle = recursosManager.construirTitulo(keyDetalle, sessionMBean.getAccionDetalle());
        this.detaDto = this.detaManager.inicializar();
        this.detaDto.setEmpresaCobranzaDto(this.dto);
    }

    public String editar() {
        sessionMBean.setAccion(applicationMBean.getEditar());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        try {
            this.dto = manager.obtenerPorId(this.dto.getId());
        } catch (DAOException ex) {
            logger.error(ex);
        }

        return manager.getUrl();
    }

    public void editarDetalle() {

        sessionMBean.setAccionDetalle(applicationMBean.getEditar());
        this.tituloDetalle = recursosManager.construirTitulo(keyDetalle, sessionMBean.getAccionDetalle());
        if (this.detaDto.getId() != null) {
            try {
                this.detaDto = this.detaManager.obtenerPorId(this.detaDto.getId());
            } catch (DAOException e) {
                showError(e.getMessage());
                logger.error(e);
            }
        }
    }

    public String ver() {
        sessionMBean.setAccion(applicationMBean.getVer());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        try {
            this.dto = manager.obtenerPorId(this.dto.getId());
        } catch (DAOException ex) {
            logger.error(ex);
        }
        return manager.getUrl();
    }

    public void verDetalle() {
        sessionMBean.setAccionDetalle(applicationMBean.getVer());
        this.tituloDetalle = recursosManager.construirTitulo(keyDetalle, sessionMBean.getAccionDetalle());
        if (this.detaDto.getId() != null) {
            try {
                this.detaDto = this.detaManager.obtenerPorId(this.detaDto.getId());
            } catch (DAOException e) {
                showError(e.getMessage());
                logger.error(e);
            }
        }
    }

    public void buscar() {
        try {
            this.lista = this.manager.obtener(this.dtoFiltro);
        } catch (DAOException ex) {
            logger.error(ex);
        }
    }

    public String guardar() throws DAOException {

        if (sessionMBean.getAccion() == applicationMBean.getNuevo()) {
            if (!validarRuc()) {
                manager.guardar(dto);
                {
                    llenarDetalleCliente();
                    llenarDetallePagos();
                    manager.editar(dto);
                }
            } else {
                showError(UtilCore.Internacionalizacion.getMensajeInternacional("empresa.ruc.duplicado"));
            }
        } else {
            manager.guardar(dto);
        }

        return null;
    }

    public void llenarDetalleCliente() throws DAOException {
        int ultimoValor = 0;
        List<CampoEmpresaDto> cEmpresaList = new ArrayList<CampoEmpresaDto>();
        for (int i = 0; i < campoManager.obtenerCamposClientesDefault().size(); i++) {
            ultimoValor = i;
            String col = "COLUMNA";
            CampoEmpresaDto cE = new CampoEmpresaDto();
            cE.setUsuarioCreacionDto(sessionMBean.getSessionUsuarioDto());
            cE.setUsuarioDto(sessionMBean.getSessionUsuarioDto());
            cE.setFechaCreacion(UtilCore.Fecha.obtenerFechaActualDate());
            cE.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
            cE.setTerminal(sessionMBean.getSessionTerminal());
            cE.setTerminalCreacion(sessionMBean.getSessionTerminal());
            cE.setCampoDto(campoManager.obtenerCamposClientesDefault().get(i));
            cE.setCampoDestino(col.concat(String.valueOf(ultimoValor + 1)));
            cE.setColumna(Long.valueOf(ultimoValor + 1));
            cE.setArchivo("C");
            cE.setEmpresaCobranzaDto(dto);
            dto.getListaDetalles().add(cE);
        }
    }

    public void llenarDetallePagos() throws DAOException {
        int ultimoValor = 0;
        List<CampoEmpresaDto> cEmpresaList = new ArrayList<CampoEmpresaDto>();

        for (int i = 0; i < campoManager.obtenerCamposPagosDefault().size(); i++) {
            ultimoValor = i;
            String col = "COLUMNA";
            CampoEmpresaDto cE = new CampoEmpresaDto();
            cE.setUsuarioCreacionDto(sessionMBean.getSessionUsuarioDto());
            cE.setUsuarioDto(sessionMBean.getSessionUsuarioDto());
            cE.setFechaCreacion(UtilCore.Fecha.obtenerFechaActualDate());
            cE.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
            cE.setTerminal(sessionMBean.getSessionTerminal());
            cE.setTerminalCreacion(sessionMBean.getSessionTerminal());
            cE.setCampoDto(campoManager.obtenerCamposPagosDefault().get(i));
            cE.setCampoDestino(col.concat(String.valueOf(ultimoValor + 1)));
            cE.setColumna(Long.valueOf(ultimoValor + 1));
            cE.setArchivo("P");
            cE.setEmpresaCobranzaDto(dto);
            dto.getListaDetalles().add(cE);
        }
    }

    public boolean validarRuc() throws DAOException {
        boolean resultado = false;
        List<EmpresaCobranzaDto> l = manager.obtenerTodos();
        if (sessionMBean.getAccion() == applicationMBean.getNuevo()) {
            for (EmpresaCobranzaDto x : l) {
                if (this.dto.getRuc().equals(x.getRuc())) {
                    resultado = true;
                }
            }
        } else if (sessionMBean.getAccion() == applicationMBean.getEditar()) {
            for (EmpresaCobranzaDto x : l) {
                if (this.dto.getId() != x.getId()) {
                    if (this.dto.getRuc().equals(x.getRuc())) {
                        resultado = true;
                    }
                }
            }
        }

        return resultado;
    }

    public void guardarDetalle() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        if (!verificarRegistro()) {
            try {
                if (this.detaManager.guardar(this.detaDto) != null) {
                    this.dto = this.manager.obtenerPorId(this.dto.getId());
                } else {
                    resultado = false;
                }
            } catch (DAOException e) {
                showError("ERROR_SISTEMA", e.getMessage());
                logger.error(e);
            }
        } else {
            showError(UtilCore.Internacionalizacion.getMensajeInternacional("empresa.error.registro.dupicado"));
            resultado = false;
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    public void eliminarDetalle() throws DAOException {
        this.detaManager.eliminar(this.detaDto);
        this.dto = this.manager.obtenerPorId(this.dto.getId());
    }

    private boolean verificarRegistro() {
        boolean resultado = false;

        if (this.dto.getListaDetalles() != null) {
            for (CampoEmpresaDto x : this.dto.getListaDetalles()) {
                if (sessionMBean.getAccionDetalle() == applicationMBean.getNuevo()) {
                    if ((this.detaDto.getCampoDto().getNombre().equals(x.getCampoDto().getNombre())
                            || this.detaDto.getColumna().equals(x.getColumna()) || this.detaDto.getCampoDestino().equals(x.getCampoDestino()))
                            && this.detaDto.getArchivo().equals(x.getArchivo())) {
                        resultado = true;
                    }
                } else if (sessionMBean.getAccionDetalle() == applicationMBean.getEditar()) {
                    if (this.detaDto.getId() != x.getId()) {
                        if ((this.detaDto.getCampoDto().getNombre().equals(x.getCampoDto().getNombre())
                                || this.detaDto.getColumna().equals(x.getColumna()) || this.detaDto.getCampoDestino().equals(x.getCampoDestino()))
                                && this.detaDto.getArchivo().equals(x.getArchivo())) {
                            resultado = true;
                        }
                    }
                }
            }
        }

        return resultado;
    }

    public String verBitacora() {
        bitacoraManager.cargarBitacoraEntidad(manager.getIdEntidad(), this.dto.getId());
        return null;
    }

    public String retroceder() {
        buscar();
        return manager.getUrlLista();
    }

    public List<EmpresaCobranzaDto> autoCompletarEmpresa(String query) {
        EmpresaCobranzaManager empCobranzaManager = (EmpresaCobranzaManager) WebServletContextListener.getApplicationContext().getBean("empresaCobranzaManager");
        List<EmpresaCobranzaDto> results = null;
        try {
            results = empCobranzaManager.autoCompletarEmpresa(query);
        } catch (DAOException ex) {
            logger.error(ex);
            results = new ArrayList<EmpresaCobranzaDto>();
        }

        return results;
    }

    /**
     * GETTER AND SETTER*
     */
    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        EmpresaCobranzaMBean.logger = logger;
    }

    public BitacoraManager getBitacoraManager() {
        return bitacoraManager;
    }

    public void setBitacoraManager(BitacoraManager bitacoraManager) {
        this.bitacoraManager = bitacoraManager;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public List<EmpresaCobranzaDto> getLista() {
        return lista;
    }

    public void setLista(List<EmpresaCobranzaDto> lista) {
        this.lista = lista;
    }

    public EmpresaCobranzaDto getDto() {
        return dto;
    }

    public void setDto(EmpresaCobranzaDto dto) {
        this.dto = dto;
    }

    public EmpresaCobranzaDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(EmpresaCobranzaDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public String getKeyEntidad() {
        return keyEntidad;
    }

    public void setKeyEntidad(String keyEntidad) {
        this.keyEntidad = keyEntidad;
    }

    public SelectItem[] getSiTipoArchivo() {
        siTipoArchivo = manager.siTipoArchivo();
        return siTipoArchivo;
    }

    public void setSiTipoArchivo(SelectItem[] siTipoArchivo) {
        this.siTipoArchivo = siTipoArchivo;
    }

    public SelectItem[] getSiTiposDatos() {
        return UtilCobranza.siTiposDatos();
    }

    public void setSiTiposDatos(SelectItem[] siTiposDatos) {
        this.siTiposDatos = siTiposDatos;
    }

    public EmpresaCobranzaManager getManager() {
        return manager;
    }

    public void setManager(EmpresaCobranzaManager manager) {
        this.manager = manager;
    }

    public String getTituloDetalle() {
        return tituloDetalle;
    }

    public void setTituloDetalle(String tituloDetalle) {
        this.tituloDetalle = tituloDetalle;
    }

    public CampoEmpresaManager getDetaManager() {
        return detaManager;
    }

    public void setDetaManager(CampoEmpresaManager detaManager) {
        this.detaManager = detaManager;
    }

    public CampoEmpresaDto getDetaDto() {
        return detaDto;
    }

    public void setDetaDto(CampoEmpresaDto detaDto) {
        this.detaDto = detaDto;
    }

    public String getKeyDetalle() {
        return keyDetalle;
    }

    public void setKeyDetalle(String keyDetalle) {
        this.keyDetalle = keyDetalle;
    }

    public List<CampoEmpresaDto> getListaCliente() {
        this.listaCliente = this.manager.obtenerListaDetalle("C", this.dto);
        return this.listaCliente;
    }

    public void setListaCliente(List<CampoEmpresaDto> listaCliente) {
        this.listaCliente = listaCliente;
    }

    public List<CampoEmpresaDto> getListaPago() {
        this.listaPago = this.manager.obtenerListaDetalle("P", this.dto);
        return this.listaPago;
    }

    public void setListaPago(List<CampoEmpresaDto> listaPago) {
        this.listaPago = listaPago;
    }

    public List<CampoDto> obtenerCampos() throws DAOException {
        CampoManager campoManager = (CampoManager) WebServletContextListener.getApplicationContext().getBean("campoManager");
        if (detaDto.getArchivo().equals("C")) {
            this.listaCampo = campoManager.obtenerCamposActivosPorTipo("C");
        } else if (detaDto.getArchivo().equals("P")) {
            this.listaCampo = campoManager.obtenerCamposActivosPorTipo("P");
        }
        return listaCampo;
    }

    public List<CampoDto> getListaCampo() throws DAOException {
        this.listaCampo = obtenerCampos();
        return this.listaCampo;
    }

    public void setListaCampo(List<CampoDto> listaCampo) {
        this.listaCampo = listaCampo;
    }

    public SelectItem[] getSiCampoDestino() {
        siCampoDestino = manager.siCampoDestino();
        return siCampoDestino;
    }

    public void setSiCampoDestino(SelectItem[] siCampoDestino) {
        this.siCampoDestino = siCampoDestino;
    }

    public CampoManager getCampoManager() {
        return campoManager;
    }

    public void setCampoManager(CampoManager campoManager) {
        this.campoManager = campoManager;
    }
}
